#ifndef TOPO_H
#define TOPO_H


/*---------- 类型定义 ----------*/
typedef void* DataType;          // 通用数据类型
typedef unsigned int HashType;   // 哈希值类型

// 函数指针类型定义
typedef HashType (*HashFunc)(DataType data);
typedef int (*CompareFunc)(DataType a, DataType b);
typedef int (*ParseDependecy)(DataType data);
typedef void (*PrintFunc)(DataType data);
typedef void (*FreeFunc)(DataType data);



typedef struct AdjNode {
    DataType dest;           // 目标节点数据
    struct AdjNode* next;    // 下一个邻接节点
} AdjNode;

typedef struct GraphNode {
    DataType data;          // 节点数据
    int indegree;           // 入度值（原始）
    AdjNode* adjList;       // 邻接链表
} GraphNode;

typedef struct {
    GraphNode* nodes;       // 节点数组
    size_t capacity;        // 总容量
    size_t size;            // 当前节点数量
    HashFunc hashFunc;      // 哈希函数
    CompareFunc cmpFunc;    // 比较函数
    ParseDependecy parseDependecy; // 解析依赖关系函数
} Graph;

typedef struct {
    DataType* order;        // 排序结果数组
    int* batches;           // 批次标记数组
    size_t size;            // 结果总数
    int totalBatches;       // 总批次数
} TopoResult;





Graph* createGraph(size_t initCapacity, HashFunc hashFunc, CompareFunc cmpFunc);
void freeGraph(Graph* graph, FreeFunc freeFunc);
int addNode(Graph* graph, DataType data);
int addEdge(Graph* graph, DataType src, DataType dest);
int topologicalSortWithBatches(const Graph* graph, TopoResult* taskTab);
int topological_sort_with_batches(const Graph* graph, TopoResult* taskTab);


#endif